package skladowisko.transport;

import java.util.ArrayList;
import java.util.List;
import obslugaTransportu.ObslugaZadania;
import obslugaTransportu.RaportObslugiTransportu;
import optymalizacjaSkladowania.PropozycjaPrzydzialow;
import optymalizacjaSkladowania.Przydzial;
import skladowisko.DostepDoPola;
import skladowisko.Maszyna;
import skladowisko.Warstwa;
import skladowisko.ZadaniePrzeladunkowe;

/**
 *
 * @author kedziers
 */
public class TransportPrzychodzacy extends Transport
{

    public TransportPrzychodzacy()
    {
        super();
    }
    //***************************************************************************

    @Override
    public RaportObslugiTransportu obsluz(PropozycjaPrzydzialow przydzialy)
    {
        if (przydzialy.getTransport() != this)
        {
            throw new IllegalStateException("Propozycja przydzialow odnosi sie do innego transportu!");
        }

        RaportObslugiTransportu raport = new RaportObslugiTransportu(this);

        List<PropozycjaPrzydzialow> grupyPrzydzialowe = new ArrayList<PropozycjaPrzydzialow>();

        for (Przydzial przydzial : przydzialy.getPrzydzialy())
        {
            Warstwa cel = (Warstwa) przydzial.getMiejsce();
            DostepDoPola dostep = cel.getPole().getSkladowisko().sprawdzDostep(cel.getPole());

            boolean przydzielono = false;
            
            for(int g=0;g< grupyPrzydzialowe.size();g++)
            {
                if(grupyPrzydzialowe.get(g).getSciezkaSkladowania() == dostep.getSciezkaSkladowania())
                {
                    grupyPrzydzialowe.get(g).addPrzydzial(przydzial);
                    przydzielono = true;
                    break;
                }
            }

            if(!przydzielono)
            {
                PropozycjaPrzydzialow nowa = new PropozycjaPrzydzialow(przydzialy.getTransport());
                nowa.setSciezkaSkladowania(cel.getPole());
                nowa.addPrzydzial(przydzial);
                grupyPrzydzialowe.add(nowa);
            }
        }



        for (PropozycjaPrzydzialow prop : grupyPrzydzialowe)
        {
            prop.sortujGrupe();

            boolean utorowany = false;

            for(Przydzial przydzial : prop.getPrzydzialy())
            {
                ZadaniePrzeladunkowe zadanie = new ZadaniePrzeladunkowe(przydzial.getKontener(), przydzial.getKontener().getMiejsce(), przydzial.getMiejsce());

            Maszyna maszyna = new Maszyna();
            ObslugaZadania raportZadania = maszyna.wykonaj(zadanie, utorowany);
            utorowany  = true;
            raport.addObslugaZadania(raportZadania);
            }
            
        }

        return raport;
    }
    //***************************************************************************

    @Override
    public String toString()
    {
        StringBuilder sb = new StringBuilder();
        sb.append("Transport Przychodzacy (id=").append(this.id).append(")\n");
        sb.append("Status transportu: ").append(this.getStatus().name()).append("\n");
        sb.append("Planowana data przyjazdu: ").append(this.getPlanowanaData().toString()).append("\n\n");
        sb.append("Transport realizowany za pomoca srodka transportu:\n");
        sb.append(this.getSrodekTransportu().toString());

        return sb.toString();
    }

    //***************************************************************************
    public String pokazSzczegoly()
    {
        StringBuilder sb = new StringBuilder();
        sb.append("Transport Przychodzacy (id=").append(this.id).append(")\n");
        sb.append("Status transportu: ").append(this.getStatus().name()).append("\n");
        sb.append("Planowana data przyjazdu: ").append(this.getPlanowanaData().toString()).append("\n\n");
        sb.append("Transport realizowany za pomoca srodka transportu:\n");
        sb.append(this.getSrodekTransportu().toString());

        return sb.toString();
    }
    //***************************************************************************
}
